<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<title>XiunoPHP 开发手册</title>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
	<meta name="keywords" content="XiunoPHP 开发手册" />
	<meta name="description" content="XiunoPHP 开发手册 " />
	<meta name="generator" content="Xiuno BBS" />
	<meta name="author" content="Xiuno Team" />
	<meta name="copyright" content="2008-2012 xiuno.com" />
	<meta name="MSSmartTagsPreventParsing" content="True" />
	<meta http-equiv="MSThemeCompatible" content="Yes" />
	<link href="common.css" type="text/css" rel="stylesheet" />
</head>

<body class="bg1">
	<div class="width big">
	
		<h1>XiunoPHP 快速入门篇</h1>
		<p>页内导航</p>
		<ul>
			<li><a href="#link1">一、第一个五分钟：Hello, world!</a></li>
			<li><a href="#link2">二、第二个五分钟：URL 格式（学院派管叫 URL-Route）</a></li>
			<li><a href="#link3">三、第三个五分钟：进阶，操作 DB</a></li>
			<li><a href="#link4">四、第四个五分钟：提高，Cache 加速</a></li>
			<li><a href="#link5">五、第五个五分钟： 回顾 MVC。</a></li>
		</ul>
		<h1><a name="link1"></a>一、第一个五分钟：Hello, world! </h1>
	
		<p>您需要一点点准备工作：</p>
		<ol>
			<li>大致了解了PHP、MySQL、面向对象、MVC。</li>
			<li>确认您本地已经安装了 PHP 运行环境。Windows 下快速搭建环境推荐 AppServ: <a href="http://prdownloads.sourceforge.net/appserv/appserv-win32-2.5.10.exe?download" target="_blank">http://prdownloads.sourceforge.net/appserv/appserv-win32-2.5.10.exe?download</a>	</li>
			<li>约定域名为 http://localhost/，网站根目录为 D:/www/</li>
			<li>一个支持UTF-8 的编辑器，快速体验，推荐 Notepad++：</li>
			<li>下载 XiunoPHP，解压到 D:/www/xiunophp/，下载地址：<a href="https://github.com/xiuno/xiunophp/archive/v1.2.zip" target="_blank">https://github.com/xiuno/xiunophp/archive/v1.2.zip</a></li>
		</ol>
		
		<p>好了，接下来开始进入开发流程，为了快速体验，先自动生成一个应用，就叫 myblog 吧。</p>
		<ol>
			<li>创建一个目录: D:/www/myblog/</li>
			<li>拷贝 D:/www/xiunophp/auto.php 到 D:/www/myblog/auto.php</li>
			<li>访问 <a href="http://localhost/myblog/auto.php" target="_blank">http://localhost/myblog/auto.php</a> 自动生成框架文件和目录</li>
			<li>访问 <a href="http://localhost/myblog/index.php" target="_blank">http://localhost/myblog/index.php</a> 生成的应用地址</li>
		</ol>
		
		<p>然后我们尝试来自己添加一段代码，来体验下。</p>
		<ol>
			<li>新建文件：myblog/control/blog_control.class.php，内容：</li>
				
<pre>
&lt;?php
	class blog_control extends base_control {
		
		function __construct(&$conf) {
			parent::__construct($conf);
		}
		
		public function on_read() {
			$name = core::gpc('name');		// 默认从 $_GET 中获取参数
			$age = core::gpc('age');
			$this-&gt;view-&gt;assign('name', $name);	// 模板赋值
			$this-&gt;view-&gt;assign('age', $age);
			$this-&gt;view-&gt;display('blog_read.htm');
		}
	}
?&gt;
</pre>
			
			<li>新建 myblog/view/blog_read.htm，添加：</li>
<pre>
&lt;!--{include header.htm}--&gt;
&lt;h1&gt;Hello, $name, age is $age!&lt;/h1&gt;	
&lt;!--{include footer.htm}--&gt;
</pre>
			<li>访问 <a href="http://localhost/myblog/?blog-read-name-lilei-age-18.htm" target="_blank">http://localhost/myblog/?blog-read-name-lilei-age-18.htm</a>，显示</li>
<pre>
Hello, lilei!age is 18!
</pre>
		</ol>
			
		<h1><a name="link2"></a>二、第二个五分钟：URL 格式（学院派管叫 URL-Route）</h1>
			<ul>
			<li>我们来回顾下刚才的URL格式：
				<pre>http://localhost/myblog/?blog-read-name-lilei.htm</pre>
			</li>
			<li>其实它等价于：
<pre>
http://localhost/myblog/index.php?blog-read-name-lilei-age-18.htm
http://localhost/myblog/index.php?0=blog&1=read&name=lilei&age=18
</pre>
			</li>
			<li>也就是说，第0个参数: control, 第1个参数: action, 后面就是按照顺序 a=b&c=d 的顺序进行排列。 <br />
				0=<b class="red">blog</b> 对应 myblog/control/<b class="red">blog</b>_control.class.php <br />
				1=<b>read</b> 对应 public function on_<b>read</b>() { ... }<br />
				name=lilei&age=18，通过 core::gpc() 获取，其实就是从$_GET 中获取。
			</li>
			<li>print_r($_GET) 我们可以得到如下数组
<pre>
	$_GET = Array
	(
		[0] =&gt; blog
		[1] =&gt; read
		[2] =&gt; name
		[3] =&gt; lilei
		[4] =&gt; age
		[5] =&gt; 18
		[name] =&gt; lilei
		[age] =&gt; 18
	)
</pre>
			第 0, 1 位为预留位，在不指名的情况下，默认为 index。<br />
			采用这个格式主要为了书写阅读方便，便于URL-Rewrite，这只是一个约定，非强制性，您如果喜欢 index.php?a=b&c=d 这种格式完全是没问题的。<br />
			</li>
			</ul>
			
<h1><a name="link3"></a>三、第三个五分钟：进阶，操作 DB</h1>
	<p>在一般的WEB开发过程中，对DB的读写操作就像呼吸一样自然。这里演示下如何通过 Model 提供的方法来操作表。</p>
	<p>XiunoPHP 对表结构有一个要求，必须含有唯一的主键。</p>
	<ol>
		<li>进入Mysql Shell, 一般是执行：mysql -uroot -proot</li>
		<li>我们使用数据库 test 作为演示：use test;</li>
		<li>创建测试表（跨DB）：
<pre>

// 创建表
$db-&gt;table_create('blog', array(
	'blogid'=&gt;'int(11)',
	'cateid'=&gt;'int(11)',
	'subject'=&gt;'char(64)',
	'message'=&gt;'text',
));

// 创建索引：1 为正序，-1 为倒序
$db-&gt;index_create('blog', array('blogid'=&gt;1));

</pre>
		</li>
		<li>修改 myblog/conf/conf.php 中的 mysql 账号配置部分。
<pre>
	'db' => array(				
		'type' => 'mysql',			
		'mysql' => array(			
			'master' =&gt; array(								
				'host' =&gt; 'localhost',								
				'user' =&gt; 'root',				
				'password' =&gt; 'root',				
				'name' =&gt; 'test',				
				'charset' =&gt; 'utf8',				
				'tablepre' =&gt; 'my_',								
				'engine'=&gt;'MyISAM',
			),			
			'slaves' =&gt; array()
		),
	),
</pre>
		</li>
		<li>创建 model/blog.class.php，复制以下内容（一般情况下，一个表对应一个 Model 文件）：
<pre>
&lt;?php
class blog extends base_model {
	function __construct(&$conf) {
		parent::__construct($conf);
		// 以下需要指定为对应的表相关信息
		$this->table = 'blog';
		$this->primarykey = array('blogid');
		$this->maxcol = 'blogid';
	}
}
?&gt;
</pre>
		</li>
		<li> 修改 control/index_control.class.php，在方法 public function on_read() { ... } 内添加：
	<pre>

	// $this-&gt;blog 在第一次使用的时候会被自动实例化（以 xiunophp/core/base_model.class.php 为原型） 

	// 增加一条记录
	$blogid = $this-&gt;blog-&gt;create(array('cateid'=&gt;1, 'subject'=&gt;'标题', 'message'=&gt;'内容'));
	
	// 读取一条记录
	$blog = $this-&gt;blog-&gt;read($blogid);
	
	// 更新一条记录
	$blog['subject'] = '更新过后的标题';
	$this-&gt;blog-&gt;update($blog);
	
	// 删除一条记录
	$this-&gt;blog-&gt;delete($blogid);
	
	// 更新一条记录
	$this-&gt;blog-&gt;update(array('blogid'=&gt;array('&gt;'=&gt;100)), array('subject'=&gt;'所有标题都长的像我。'));
	
	// 删除一条记录
	$this-&gt;blog-&gt;delete(array('blogid'=&gt;array('&gt;'=&gt;100)));
	
	// 清空整个表
	$this-&gt;blog-&gt;truncate();
	
	// 获取总数
	$maxid = $this-&gt;blog-&gt;count();
	
	// 以上基本上是所有的常见操作了，更多请参考手册的 Model 部分。 
	// 标准的 CURD，很简单吧，不用再去理会 SELECT UPDATE DELETE SQL 语法了，这样做的好处不仅仅是改变一下SQL的写法，后面我会再说。
	</pre>
		</li>
	</ol>
		
	<h1><a name="link4"></a>四、第四个五分钟：提高，Cache 加速</h1>
	<p>上一个五分钟我们已经学会了不通过 SQL 操作 DB，接下来我们来学习下使用 Memcached 等缓存来加速。</p>
	<ol>
		<li>修改 myblog/conf/conf.php, 修改：
		<pre>
		'cache' => array(
			'enable'=>0,
			'type'=>'memcache',
			'memcache'=>array (
				'multi'=>0,
				'host'=>'10.0.0.253',
				'port'=>'11211',
			)
		),
		</pre>
		</li>
		<li> 修改 host, port 为您的 Memcached 服务器参数，最后将 enable 改为 1。</li>
		<li>完毕</li>
	</ol>
	<p>XiunoPHP 将 Cache 完全透明封装了，您可以随时开启和关闭 Cache。</p>
	
	<h1><a name="link5"></a>五、第五个五分钟： 回顾 MVC。</h1>
	<p>通过上面的四个五分钟，我们已经大致了解了使用 XiunoPHP 进行的开发流程，MVC+CACHE。</p>
	<p>XiunoPHP 在实践 MVC 思想时，实际上就是将代码从逻辑上进行分块，HTML CSS JS 一个目录(view)，PHP 对DB的表读写放一个目录(model)，PHP 对业务逻辑的处理(最杂的部分）一个目录(control)。</p>
	<br /><br /><br />
</body>
</html>
